drop procedure insertar_detallecontratacion;
delimiter ?
CREATE PROCEDURE insertar_detallecontratacion(IN fId_cliente int,IN fid_contratacion int,IN fid_servicio int,IN fcantidad int,IN fdescuento DECIMAL (15,2))
	BEGIN
		DECLARE fcns_cs int DEFAULT 0;
		DECLARE ffecha DATE DEFAULT '';
		DECLARE fhora TIME DEFAULT '';
		DECLARE ffecha_old DATE;
		DECLARE fnum_sesiones_pago int;
		DECLARE fprecio_total DECIMAL(10,2);
		DECLARE fprecio DECIMAL(10,2);
		DECLARE fcns_cp int DEFAULT 0;
		DECLARE fcns int DEFAULT 0;
		DECLARE fcns_descuentos int DEFAULT 0;
		#DECLARE fdescuento DECIMAL (15,2) DEFAULT 0;
		
		#Datos del sistema
		select CURRENT_DATE() into ffecha;
		select CURTIME() into fhora;
		
		#Datos de variables usadas a lo largo del procedimiento
		SELECT IFNULL(MAX(cns_cs),0) into fcns_cs FROM contratacion_servicio WHERE Id_servicio=fid_servicio;
		SET fcns_cs=fcns_cs+1;		
		SELECT sesiones_de_pago INTO fnum_sesiones_pago FROM servicio WHERE Id_servicio=fid_servicio;
		SELECT precio INTO fprecio_total FROM servicio WHERE Id_servicio=fid_servicio;
		

		#Crear descuento unicamente para esta partida
		#Es un descuento ingresado al momento de crear la contratacion
		IF fdescuento>0 THEN
			SELECT IFNULL(MAX(cns_descuentos),0) into fcns_descuentos FROM servicio_descuentos WHERE Id_servicio=fid_servicio;
			SET fcns_descuentos=fcns_descuentos+1;
			INSERT INTO servicio_descuentos (Id_servicio,cns_descuentos,fecha_i,fecha_f,descuento,status) VALUES(fid_servicio,fcns_descuentos,ffecha,ffecha,fdescuento,0);
			SET fprecio_total = fprecio_total-(fprecio_total*(fdescuento/100));
			INSERT INTO cs_sd (Id_contratacion,cns_cs,Id_servicio,cns_descuentos) VALUES (fid_contratacion,fcns_cs,fid_servicio,fcns_descuentos);
		ELSE
			#Descuento creado de forma previa
			#Verificacion y aplicacion de descuentos en los servicios
			SELECT IFNULL(descuento,0) INTO fdescuento FROM  servicio_descuentos WHERE Id_servicio=fid_servicio AND status=1 AND DATE(ffecha) BETWEEN fecha_i AND fecha_f;
			SELECT IFNULL(cns_descuentos,0) INTO fcns_descuentos FROM servicio_descuentos WHERE Id_servicio=fid_servicio AND status=1 AND DATE(ffecha) BETWEEN fecha_i AND fecha_f;
			SET fprecio_total = fprecio_total-(fprecio_total*(fdescuento/100));
			IF fdescuento != 0 THEN
					INSERT INTO cs_sd (Id_contratacion,cns_cs,Id_servicio,cns_descuentos) VALUES (fid_contratacion,fcns_cs,fid_servicio,fcns_descuentos);
			END IF;

		END IF;
		
		INSERT INTO contratacion_servicio(cns_cs,Id_servicio,Id_cliente,cantidad,precio,Id_contratacion,fecha,hora,Id_estatus) values(fcns_cs,fid_servicio,fId_cliente,fcantidad,fprecio_total,fid_contratacion,ffecha,fhora,3);
		
		SELECT min(fecha) INTO ffecha_old FROM contratacion_servicio WHERE Id_cliente=fId_cliente AND Id_estatus=3;
		
		SET fprecio_total=fprecio_total*fcantidad;
		
		SET fprecio=fprecio_total/fnum_sesiones_pago;
		
		SELECT IFNULL(MAX(cns_cp),0) INTO fcns_cp FROM calendario_pago WHERE Id_servicio=fid_servicio;
		
		#Calculando nuevo saldo del cliente
		UPDATE cliente SET saldo=fprecio_total+saldo WHERE Id_cliente=fId_cliente;
		
		#Actualizacion de pago restante para este registro
		UPDATE contratacion_servicio SET restante_de_pago=fprecio_total WHERE cns_cs=fcns_cs AND Id_servicio=fid_servicio;
		
		#Calculo del abono mensual
		CALL calculo_abono_mensual(fid_servicio,fcns_cs);
		
		WHILE fnum_sesiones_pago > 0 DO
			
			SET fcns=fcns+1;
			#Recalculando el ultimo abono para cuadrar centavos
			IF fnum_sesiones_pago=1 THEN
				SET fprecio=fprecio_total-((fcns-1)*fprecio);
			END IF;
			
			SET fcns_cp=fcns_cp+1;
			
			SET fnum_sesiones_pago=fnum_sesiones_pago-1;
			INSERT INTO calendario_pago (cns_cp,cns_cs,Id_servicio,Id_estatus,fecha,abono) values (fcns_cp,fcns_cs,fid_servicio,5,ffecha_old,fprecio);
			
			SELECT date_add(ffecha_old,INTERVAL 1 MONTH) INTO ffecha_old;
			
		END WHILE;
		
	END ?
delimiter ;

BEGIN;

	CALL insertar_detallecontratacion(1226,2096,27,1,30);
ROLLBACK;

